package br.com.imob.dao;

import br.com.imob.modelo.Contato;

import java.util.List;

/** @user Gilton Nascimento
 *  @since 09:51:17 01/02/2011 2011
 *  @version 
 */

public class ContatoDao extends GenericDao {
	
	public ContatoDao() {  }
	
	public Integer adicionarContato(Contato contato) {
		saveOrUpdatePojo(contato);
		return contato.getContatoId();
	}
	
	public void removerContato(Contato contato) {
		removerPojo(contato);
	}

	/* Precisa definir o ID */
	public void atualizarContato(Contato recupera) {
		saveOrUpdatePojo(recupera);
	}

	/**
	 * Editar um Contato
	 * @param String oldContato
	 * @param String newContato
	 */
	public void atualizarContato(String tpStr, String oldContato, String newContato ) {
		if( "telefone".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldContato) && oldContato != null )
					&& ( !"".equalsIgnoreCase(newContato) && newContato != null ) ) 
				atualizarContato( getContatoQNamedFone(oldContato), new Contato(tpStr, newContato) );
		}
		
		if( "celular".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldContato) && oldContato != null )
					&& ( !"".equalsIgnoreCase(newContato) && newContato != null ) ) 
				atualizarContato( getContatoQNamedCell(oldContato), new Contato(tpStr, newContato) );
		}
		if( "comercial".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldContato) && oldContato != null )
					&& ( !"".equalsIgnoreCase(newContato) && newContato != null ) ) 
				atualizarContato( getContatoQNamedComercial(oldContato), new Contato(tpStr, newContato) );
		}
		if( "fax".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldContato) && oldContato != null )
					&& ( !"".equalsIgnoreCase(newContato) && newContato != null ) ) 
				atualizarContato( getContatoQNamedFax(oldContato), new Contato(tpStr, newContato) );
		}
	}
	
	
	/* Precisa definir qual atribuito sera a chave a identificar 
	 * a tupla a ser alterada */
	public void atualizarContato( String fone, String cell, String comerc, String fx ) {
		saveOrUpdatePojo( setAttributsContato(fone, cell, comerc, fx) );
	}
	
	private Contato setAttributsContato (String fone, String cell, String comerc, String fx) {
		Contato contact = new Contato();
		
		if( !fone.equals(null) || !"".equals(fone) ) 
			contact.setTelefone(fone);
		if( !cell.equals(null) || !"".equals(cell) ) 
			contact.setCelular(cell);
		if( !comerc.equals(null) || !"".equals(comerc) ) 
			contact.setComercial(comerc);
		if( !fx.equals(null) || !"".equals(fx) ) 
			contact.setFax(fx);
		
		return contact;
	}
	
	/* Precisa definir qual atribuito sera a chave a identificar 
	 * a tupla a ser alterada */
	public void atualizarContato(Contato recuperar, Contato alterar) {
		recuperar = retriveContato(recuperar);
		
		if(alterar.getTelefone() != null)
			recuperar.setTelefone(alterar.getTelefone());
		if(alterar.getCelular() != null)
			recuperar.setCelular(alterar.getCelular());
		if(alterar.getComercial() != null)
			recuperar.setComercial(alterar.getComercial());
		if(alterar.getFax() != null)
			recuperar.setFax(alterar.getFax());
		
		saveOrUpdatePojo(recuperar);
	}
	
//	Artificio para Recuperar a Tupla de Contato
	protected Contato retriveContato(Contato recuperar) {
		if(recuperar.getContatoId() != null)
			return getContato(recuperar.getContatoId());
		if(recuperar.getTelefone() != null)
			return getContatoQNamedFone(recuperar.getTelefone());
		if(recuperar.getCelular() != null)
			return getContatoQNamedCell(recuperar.getCelular());
		if(recuperar.getComercial() != null)
			return getContatoQNamedComercial(recuperar.getComercial());
		if(recuperar.getFax() != null)
			return getContatoQNamedFax(recuperar.getFax());
		
		return recuperar;
	}
	
	
//	Consultas
	public Contato getContato(Integer key) {
		return getPojoByID(Contato.class, key);
	}
	public Contato getContatoByQuery(String query, Object...params) {
		return getPojoByQry(query, params);
	}
	public Contato getContatoQNamedFone(String fltrFone) {
		return getPojoByQNamed("Contato.findByTelefone", fltrFone);
	}
	public Contato getContatoQNamedCell(String fltrCell) {
		return getPojoByQNamed("Contato.findByCelular", fltrCell);
	}
	public Contato getContatoQNamedComercial(String fltrComer) {
		return getPojoByQNamed("Contato.findByComercial", fltrComer);
	}
	public Contato getContatoQNamedFax(String fltrFax) {
		return getPojoByQNamed("Contato.findByFax", fltrFax);
	}
	
	public List<Contato> getContatos() {
		return (List<Contato>) getALL(Contato.class);
	}
	public List<Contato> getContatosQNamedFonePRX(String fltrFone) {
		return getListByQNamedPRX("Contato.findLikeByTelefone", fltrFone);
	}
	public List<Contato> getContatosQNamedCellPRX(String fltrCell) {
		return getListByQNamedPRX("Contato.findLikeByCelular", fltrCell);
	}
	public List<Contato> getContatosQNamedComercialPRX(String fltrComercial) {
		return getListByQNamedPRX("Contato.findLikeByComercial", fltrComercial);
	}
	public List<Contato> getContatosQNamedFaxPRX(String fltrFax) {
		return getListByQNamedPRX("Contato.findLikeByFax", fltrFax);
	}
	public List<Contato> getContatosByQuery(String query, Object...params) {
		return getListByQry(query, params);
	}

}